package test

import (
	"crypto/aes"      // 导入AES加密包
	"crypto/cipher"   // 导入密码学工具包
	"crypto/rand"     // 导入随机数生成包
	"encoding/base64" // 导入Base64编码包
	"fmt"
	"io"
)

func main1() {
	key := []byte("0123456789abcdef0123456789abcdef") // 定义32字节的密钥，用于AES-256加密
	plaintext := []byte("Hello, World!")              // 待加密的明文数据

	// 使用密钥创建一个新的AES加密块
	block, err := aes.NewCipher(key)
	if err != nil {
		fmt.Println("Error creating AES cipher:", err) // 输出错误信息并退出程序
		return
	}

	// 创建一个CBC模式的加密器，用于加密明文数据
	ciphertext := make([]byte, aes.BlockSize+len(plaintext)) // 分配足够的空间存储加密后的密文数据
	iv := ciphertext[:aes.BlockSize]                         // 提取前16字节作为初始化向量（IV）的空间
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {  // 从随机数生成器中读取16字节作为IV的值
		fmt.Println("Error generating random IV:", err) // 输出错误信息并退出程序
		return
	}
	mode := cipher.NewCBCEncrypter(block, iv)               // 使用AES加密块和IV创建CBC模式的加密器
	mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext) // 对明文数据进行加密，并将结果存储在ciphertext中

	// 对密文进行Base64编码，以便进行传输或存储
	encodedCiphertext := base64.StdEncoding.EncodeToString(ciphertext) // 将密文转换为Base64编码的字符串
	fmt.Println("Encrypted Ciphertext:", encodedCiphertext)            // 输出加密后的密文

	// 解密过程 -------------------------------------------

	// 解码Base64编码的密文，将其还原为原始的二进制数据
	decodedCiphertext, err := base64.StdEncoding.DecodeString(encodedCiphertext)
	if err != nil {
		fmt.Println("Error decoding Base64:", err) // 输出错误信息并退出程序
		return
	}

	// 提取IV和密文，准备进行解密操作
	iv = decodedCiphertext[:aes.BlockSize]                 // 提取前16字节作为IV的值
	ciphertext = decodedCiphertext[aes.BlockSize:]         // 提取剩余的字节作为密文数据
	mode = cipher.NewCBCDecrypter(block, iv)               // 使用AES加密块和IV创建CBC模式的解密器
	mode.CryptBlocks(ciphertext, ciphertext)               // 对密文数据进行解密，并将结果存储在ciphertext中（覆盖原始密文）
	padding := int(ciphertext[len(ciphertext)-1])          // 获取最后一个字节的值，作为PKCS#7填充的长度
	plaintext = ciphertext[:len(ciphertext)-padding]       // 去除填充，得到原始的明文数据
	fmt.Println("Decrypted Plaintext:", string(plaintext)) // 输出解密后的明文数据
}
